package view; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; import javax.swing.JTextArea; import javax.swing.JTextField; import controller.Operations; import controller.PolynomialProcess; import javax.swing.BoxLayout; import java.awt.event.*; import models.DoublePolynomial; import models.IntPolynomial; import javax.swing.JOptionPane; import java.text.DecimalFormat; /** * The class that contains the graphical user interface. * @author Ghiurutan * */ public class Gui extends JFrame implements ActionListener { private static final long serialVersionUID = 211431534849779406L; private static String ERROR = "Error"; private static String ERROR_POLYNOMIAL = "You didn't enter the polynomial."; private static String ERROR_POLYNOMIALS = "You didn't enter both polynomials."; private JPanel north, north1, north2, center, south, evaluatePanel, exponentiationPanel; private JButton addition, subtraction, multiplication, division, evaluate, exponentiation, findRoot, derivation, integration, areEqual, drawGraph; private BoxLayout layout; private JTextArea pol1, pol2, rezult; private JTextField eval, exp, polynomial1, polynomial2; private Operations operations; private DecimalFormat decimalFormat; private Graph polynomialGraph; public Gui() { super("Polynomial"); operations = new Operations(); decimalFormat = new DecimalFormat(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLocationRelativeTo(null); initializeNorthSection(); initializeCenterSection(); initializeSouthSection(); this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS)); this.setSize(400, 450); this.setLocationRelativeTo(null); this.setVisible(true); JOptionPane.showMessageDialog(this, "Please insert polynomials in their mathematical form.For example: x^3-2x^2+x+3", "Information", JOptionPane.INFORMATION_MESSAGE); } private void initializeNorthSection() { north = new JPanel(); layout = new BoxLayout(north, BoxLayout.Y_AXIS); north.setLayout(layout); north1 = new JPanel(); polynomial1 = new JTextField("Polynomial 1:"); polynomial1.setEditable(false); pol1 = new JTextArea(1, 10); north1.add(polynomial1); north1.add(pol1); north2 = new JPanel(); polynomial2 = new JTextField("Polynomial 2:"); polynomial2.setEditable(false); pol2 = new JTextArea(1, 10); north2.add(polynomial2); north2.add(pol2); north.add(north1); north.add(north2); this.add(north); } private void initializeCenterSection() { center = new JPanel(); addition = new JButton("+"); addition.addActionListener(this); subtraction = new JButton("-"); subtraction.addActionListener(this); multiplication = new JButton("*"); multiplication.addActionListener(this); division = new JButton("/"); division.addActionListener(this); evaluatePanel = new JPanel(); eval = new JTextField(5); evaluate = new JButton("Evaluate"); evaluate.addActionListener(this); evaluatePanel.add(eval); evaluatePanel.add(evaluate); exponentiationPanel = new JPanel(); exp = new JTextField(5); exponentiation = new JButton("f(x)^n"); exponentiation.addActionListener(this); exponentiationPanel.add(exp); exponentiationPanel.add(exponentiation); derivation = new JButton("f '(x)"); derivation.addActionListener(this); integration = new JButton("S f(x) dx"); integration.addActionListener(this); areEqual = new JButton("Are equal?"); areEqual.addActionListener(this); findRoot = new JButton("Find root"); findRoot.addActionListener(this); drawGraph = new JButton("Draw graph"); drawGraph.addActionListener(this); center.add(addition); center.add(subtraction); center.add(multiplication); center.add(division); center.add(evaluatePanel); center.add(exponentiationPanel); center.add(derivation); center.add(integration); center.add(areEqual); center.add(findRoot); center.add(drawGraph); this.add(center); } private void initializeSouthSection() { south = new JPanel(); rezult = new JTextArea(1, 10); rezult.setEditable(false); south.add(rezult); this.add(south); } private void checkForBothPolynomials() { if (pol1.getText().equals("") || pol2.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIALS, JOptionPane.ERROR_MESSAGE); return; } } @Override public void actionPerformed(ActionEvent event) { if (event.getSource() == addition) { checkForBothPolynomials(); rezult.setText( operations .add(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), new IntPolynomial(new PolynomialProcess().getPolynomial(pol2.getText()))) .toString()); } else if (event.getSource() == subtraction) { checkForBothPolynomials(); rezult.setText( operations .subtract(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), new IntPolynomial(new PolynomialProcess().getPolynomial(pol2.getText()))) .toString()); } else if (event.getSource() == multiplication) { checkForBothPolynomials(); rezult.setText( operations .multiply(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), new IntPolynomial(new PolynomialProcess().getPolynomial(pol2.getText()))) .toString()); } else if (event.getSource() == division) { checkForBothPolynomials(); DoublePolynomial[] values = operations.division( new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), new IntPolynomial(new PolynomialProcess().getPolynomial(pol2.getText()))); rezult.setText("Quotient: " + values[0].toString() + "\n"); rezult.append("Rest: " + values[1].toString()); } else if (event.getSource() == evaluate) { double number; if (pol1.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } if (eval.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } try { number = Double.parseDouble(eval.getText()); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ERROR, "You didn't enter a valid number.", JOptionPane.ERROR_MESSAGE); return; } rezult.setText(decimalFormat.format(operations .evaluate(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), number))); } else if (event.getSource() == exponentiation) { int number; if (pol1.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } if (exp.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, "You didn't enter any value.", JOptionPane.ERROR_MESSAGE); return; } try { number = Integer.parseInt(exp.getText()); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(this, ERROR, "You didn't enter a valid number.", JOptionPane.ERROR_MESSAGE); return; } rezult.setText(String.valueOf(operations .exponentiation(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), number))); } else if (event.getSource() == derivation) { if (pol1.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } rezult.setText(operations .derivation(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText()))).toString()); } else if (event.getSource() == integration) { if (pol1.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } rezult.setText(operations .integration(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText()))).toString()); } else if (event.getSource() == areEqual) { checkForBothPolynomials(); if (operations.areEqual(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), new IntPolynomial(new PolynomialProcess().getPolynomial(pol2.getText())))) { rezult.setText("Polynomials are equal."); } else { rezult.setText("Polynomials are not equal."); } } else if (event.getSource() == findRoot) { if (pol1.getText().equals("")) { JOptionPane.showMessageDialog(this, ERROR, ERROR_POLYNOMIAL, JOptionPane.ERROR_MESSAGE); return; } rezult.setText( operations.findRoot(new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())))); } else if (event.getSource() == drawGraph) { polynomialGraph = new Graph(); polynomialGraph.setYCoordinates(operations.computeYCoordinatesForGraph( new IntPolynomial(new PolynomialProcess().getPolynomial(pol1.getText())), polynomialGraph.getXCoordinates())); JFrame graphDisplay = new JFrame("Graph"); graphDisplay.add(polynomialGraph); graphDisplay.setSize(430, 430); graphDisplay.setVisible(true); graphDisplay.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); } } }